#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>

// //情况1写端不写，读端一直读
// int main()
// {
//     //父进程创建管道
//     int fd[2] = {0};

//     if(pipe(fd) == -1){
//         //-1表示创建失败
//         perror("pipe error!\n");
//         exit(-1);
//     }

//     //2.父进程创建子进程
//     pid_t pid = fork();
//     if(pid == 0){
//         //child
//         //3. child write
//         const char* msg = "hello I am father\n";
//         int count = 5;
//         while(count--){
//             write(fd[1], msg, strlen(msg));
//             sleep(2);
//         }

//         close(fd[1]);
//         exit(0);
//     }

//     close(fd[1]);
//     //father
//     //3.father read
//     //关闭写端
//     //4.read message
//     char buff[64] = { 0 };
//     while(1){
//         ssize_t s = read(fd[0], buff, sizeof(buff));
//         if(s == 0){
//             //写文件关闭了
//             printf("write file close\n");
//             break;
//         }
//         else if(s > 0){
//             printf("child say: %s", buff);
//         }
//         else{
//             printf("error!\n");
//         }
//     }
    
//     close(fd[0]);
//     waitpid(-1, NULL, 0);
//     printf("wait child process success\n");
//     return 0;
// }

// //情况2：读端不读，写端一直写
// int main()
// {
//     int fd[2] = { 0 };
//     if(pipe(fd) == -1){
//         perror("pipe error!!\n");
//         exit(-1);
//     }

//     pid_t pid = fork();
//     if(pid == 0){
//         //child 1
//         close(fd[0]);
//         int count = 0;
//         while(1){
//             write(fd[1], "a", 1);
//             count++;
//             printf("child say success! :%d\n", count);
//         }
//     }

//     //father
//     close(fd[1]);
//     //4.read message
//     waitpid(-1, NULL, 0);
//     return 0;
// }

//只关闭写端
// int main()
// {
//     int fd[2] = {0};
//     if(pipe(fd) == -1){
//         perror("pipe error\n");
//         exit(-1);
//     }

//     pid_t  id = fork();
//     if(id == 0){
//         //child
//         close(fd[0]);
//         int count = 5;
//         const char* msg = "hello world\n";
//         while(count--){
//             write(fd[1], msg, strlen(msg));
//             sleep(1);
//         }
//         close(fd[1]);
//         exit(0);
//     }

//     char buff[64];
//     close(fd[1]);
//     while(1){
//         ssize_t s = read(fd[0], buff, sizeof(buff));
//         if(s == 0){
//             printf("write close\n");
//             break;
//         }
//         printf("child say : %s", buff);
//     }
//     while(1){
//         printf("father still exist\n");
//         sleep(1);
//     }
//     return 0;
// }


//读端关闭
// int main()
// {
//     int fd[2] = {0};
//     if(pipe(fd) < 0){
//         perror("pipe error!\n");
//         return -1;
//     }

//     pid_t pid = fork();
//     if(pid == 0){
//         //child
//         close(fd[0]);
//         const char* msg = "hello world!\n";
//         while(1){
//             write(fd[1], msg, strlen(msg));
//             printf("send success!\n");
//             sleep(1);
//         }

//         // we do not set _exit func there

//     }

//     //father
//     //最后可以发现，当读端关闭，进程会自动退出
//     close(fd[1]);
//     sleep(6);
//     close(fd[0]);
//     int status = 0;
//     waitpid(pid, &status, 0);
//     printf("wait child process success!\n");
//     //printf("wait child process success!\n");
//     printf("the singal is : %d\n", status & 0x7f );
//     return 0;
// }

// int main()
// {
//     if(mkfifo("myfifo", 0666) < 0){
//         perror("mkfifo fail!\n");
//         return -1;
//     }
//     return 0;
// }
